package bachelor.view {
	import CustomEvent.CustomEvent;

	import bachelor.Globals;

	import gs.TweenLite;
	import gs.easing.Cubic;

	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.geom.Point;

	/**
	 * @author Johannes
	 */
	public class Layer extends MovieClip 
	{
		
////////////////////////////////////////////////////////////////////////////////
/////// VARIABLES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

		private var _myXML : XML;
		private var _myLayerIndex : int;
		private var _activeGrid : int;
		private var _picSize : int;
		
		private var _loadedPicCounter : int = 0;
		
		private var _clickable : Boolean;
		private var _unclickableRect : MovieClip = MovieClip(new kreuzeMC());

		public static const CREATE_BOOKMARK : String = "createBookmark";
		public static const SINGLE_LAYER_LODED : String = "lastLayerLoaded";


	////////////////////////////////////////////////////////////////////////////////
/////// CONSTRUCTOR ////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
		public function Layer(p_myXML : XML, p_layerStep : int, p_activeGrid : int) 
		{
//			trace("     Layer -> Constructor init...");
			
			_myXML = p_myXML; 
			_myLayerIndex = p_layerStep;
			_activeGrid = p_activeGrid;
			_picSize = 200/Math.sqrt(_activeGrid);

			// Layer-BG
			this.graphics.beginFill(0xCACACA, 1);
			this.graphics.drawRect(-101, -101, 202, 202);
			this.graphics.endFill();
			
	
			init();
		}
		
		
		
////////////////////////////////////////////////////////////////////////////////
/////// METHODS ////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////


/////// init ///////////////////////////////////////////////////////////////////
		private function init() : void
		{
//			trace("     Layer -> init() ...");
			
			// add to a layerArray!! und Methode 
			// var _myNewLayer : Layer = new Layer(p_myXML : XML, p_offset : int);
			// Rest dieser Methode in Layer-Klasse verfrachten


			/*
			 * Bilder-Grid in Zeilen und Spalten erstellen.
			 */ 
			var _picID : int = _myLayerIndex * _activeGrid;
			for(var i:int = Math.sqrt(_activeGrid); i > 0; i--)		// Spalten
			{
				for(var j:int = Math.sqrt(_activeGrid); j > 0; j--)	// Zeilen
				{
					var _pic : Pic = new Pic(_myXML.image[_picID].path, _picSize, _picID);
					/*
					 * Bild (Registrierpunkt mittig) am Grif ausrichten
					 */
					_pic.x = getPicXInGrid(_picID);
					_pic.y = getPicYInGrid(_picID);
					
					_pic.addEventListener(Pic.PIC_FINGER_UP, picFingerUpHandler);
					_pic.addEventListener(Pic.SINGLE_PIC_LOADED, onSinglePicLoadedHandler);
					_pic.addEventListener(Event.ADDED, onAddedHandler);
					
					_picID++;

				}
			}
			

		}
		

/////// Letztes Bild fertig geladen: Country jetzt fertig einfaden /////////////
		private function onSinglePicLoadedHandler(evt : Event) : void 
		{
//			trace("     Layer -> onSinglePicLoadedHandler() ...");
			var singleLoadedPic : Pic = evt.target as Pic;
			singleLoadedPic.removeEventListener(Pic.SINGLE_PIC_LOADED, onSinglePicLoadedHandler);
		}


/////// Bild geadded, nun anzeigen /////////////////////////////////////////////
		private function onAddedHandler(evt : Event) : void
		{
			//trace("Layer -> onAddedHandler() ...");
			var addedPic : Pic = evt.currentTarget as Pic;
			addedPic.removeEventListener(Event.ADDED, onAddedHandler);
			
			addChild(addedPic);
			
			/*
			 * Mitzählen, wie vile Bilder auf dieser Layer schon geladen wurden.
			 */
			_loadedPicCounter++;
			/*
			 * Wenn das Grid dieses Layers mit allen Pics fertig geladen ist, 
			 * dem Country Bescheid geben.
			 */
			if(_loadedPicCounter >= _activeGrid) {
				dispatchEvent(new Event(SINGLE_LAYER_LODED));
				
				// make unclickable
				addChild(_unclickableRect);
				_unclickableRect.alpha = 0;
				_clickable = false;
				
			}
		}



/////// Hilfsfunktionen für Pic-Grid ///////////////////////////////////////////
		private function getPicXInGrid(p_picID : int) : int {
			var x : int = (p_picID % Math.sqrt(_activeGrid)) * _picSize	- 100 + _picSize / 2;
			return x;
		}
		
		private function getPicYInGrid(p_picID : int) : int {
			var y : Number = (Math.floor(((p_picID % _activeGrid)) / Math.sqrt(_activeGrid)) + 1) * _picSize - 100 - _picSize / 2;
			return y;
		}

		


/////// Bookmark-Erstellung in Auftrag geben ///////////////////////////////////
		private function picFingerUpHandler(evt : Event) : void 
		{
			var draggedPic : Pic = evt.target as Pic;
//			trace("     Layer -> picFingerUpHandler() ::: XY-Pos " + Math.round(draggedPic.x) + "/" + Math.round(draggedPic.y) + " von Pic " + draggedPic.getPicID() + " auf Layer " + this._myLayerIndex);

			// HitTest
			if(draggedPic.x > -120 && draggedPic.x < 120 && draggedPic.y > -120 && draggedPic.y < 120) 
			{
				// Pic-Reset unten 
//				trace("============= INNERHALB =========");
			} else {
				// Bookmark erstellen lassen
//				trace("============= AUSSERHALB =========");
				
				var fingerUpPointOnLayer : Point = new Point(draggedPic.x, draggedPic.y);
			    var fingerUpPointOnStage : Point = this.localToGlobal(fingerUpPointOnLayer); 
				
				var dataArray : Array = new Array(_myXML.image[draggedPic.getPicID()].path, _picSize, fingerUpPointOnStage.x, fingerUpPointOnStage.y, draggedPic.scaleX, draggedPic.scaleY, draggedPic.rotation);
				dispatchEvent(new CustomEvent(CREATE_BOOKMARK, dataArray));
				
				draggedPic.alpha = 0;
				TweenLite.to(draggedPic, Globals.fadeTime/2, {alpha: 1, overwrite: 2, ease: Cubic.easeIn});
			}
			
			// draggedPic in jedem Fall resetten
			draggedPic.x = getPicXInGrid(draggedPic.getPicID());
			draggedPic.y = getPicYInGrid(draggedPic.getPicID());
			draggedPic.scaleX = 1;
			draggedPic.scaleY = 1;
			draggedPic.rotation = 0;
		}

		



/////// Uncickable /////////////////////////////////////////////////////////////
		public function makeClickable() : void {
			if(_clickable == false)
			{
//				trace("     Layer -> makeClickable() ...   Neuer Status: _clickable = true");
				_clickable = true;
				_unclickableRect.visible = false;			
			}
		}

		public function makeUnclickable() : void {
			if(_clickable == true) {
//				trace("     Layer -> makeUnclickable() ... Neuer Status: _clickable = false");
				_clickable = false;
				_unclickableRect.visible = true;
			}
		}






////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
	}
}
